/**
 * @author: Gene
 * @age: 永远18岁的美少年
 * @Email： yangjianyun@58.com
 * @date: 2021-12-23 10:23:33
 * @description:  ts中的接口 interface
 */

/**
 * 接口是对 JavaScript 本身的随意性进行约束，
 * 通过定义一个接口，约定了  变量、 类、函数  等应该按照什么样的格式进行声明，
 * 实现多人合作的一致性。TypeScript 编译器依赖接口用于类型检查，最终编译为 JavaScript 后，接口将会被移除。
 */

interface IClothes {
    size?: string
    color?: string
    readonly price: number // 接口的只读属性
}

// 创建的时候给price 赋值, 创建完成之后,不可再修改
let myClothes = {
    size: "middle",
    color: "red",
    price: 12,
}

/** 2. 有的时候,我们希望,接口可以添加任意属性, 需要定义一个活的属性,方便添加 */
interface IIterface {
    name: string
    age: number
    address?: string

    [key: string]: any // 可以添加任意属性
}

/** 3. 接口约束函数类型 */
interface SubFn {
    (name: string, age: number): void
}

/** 4. 可索引类型的接口 */
interface IScenicIterface {
    [index: number]: string // 表示的是一个可索引的接口. 可以用来约束数组.
}

let arr: IScenicIterface = ['西湖', '华山', '故宫']
let favorite: string = arr[0]
console.log(favorite);